home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1993 July / Internet Tools.iso / RockRidge / mail / pp / pp-6.0 / Src / qmgr / assoc.c next >
Encoding:
C/C++ Source or Header  |  1991-12-18  |  4.4 KB  |  179 lines

  1. /* assoc.c: association functions for clients */
  2.  
  3. # ifndef lint
  4. static char Rcsid[] = "@(#)$Header: /xtel/pp/pp-beta/Src/qmgr/RCS/assoc.c,v 6.0 1991/12/18 20:27:38 jpo Rel $";
  5. # endif
  6.  
  7. /*
  8.  * $Header: /xtel/pp/pp-beta/Src/qmgr/RCS/assoc.c,v 6.0 1991/12/18 20:27:38 jpo Rel $
  9.  *
  10.  * $Log: assoc.c,v $
  11.  * Revision 6.0  1991/12/18  20:27:38  jpo
  12.  * Release 6.0
  13.  *
  14.  */
  15.  
  16.  
  17.  
  18. #include "util.h"
  19. #include "types.h"
  20. #include "qmgr.h"
  21.  
  22. int    assoc_start (myservice, fd)
  23. char    *myservice;
  24. int    *fd;
  25. {
  26.     extern char *pptsapd_addr;
  27.     static struct PSAPctxlist pcs;
  28.     struct SSAPref sfs;
  29.     register struct SSAPref *sf;
  30.     struct TSAPaddr *ta;
  31.     static struct PSAPaddr pas, *pa;
  32.     static OID     ctx,
  33.         pci;
  34.     struct AcSAPconnect accs;
  35.     register struct AcSAPconnect   *acc = &accs;
  36.     struct AcSAPindication  acis;
  37.     register struct AcSAPindication *aci = &acis;
  38.     register struct AcSAPabort *aca = &aci -> aci_abort;
  39.     struct RoSAPindication rois;
  40.     register struct RoSAPindication *roi = &rois;
  41.     register struct RoSAPpreject *rop = &roi -> roi_preject;
  42.     int    result;
  43.  
  44.     if (pa == NULLPA) {
  45.         if ((pa = str2paddr (pptsapd_addr)) == NULLPA) {
  46.             PP_LOG (LLOG_EXCEPTIONS,
  47.                 ("Can't translate %s",
  48.                  pptsapd_addr));
  49.             return NOTOK;
  50.         }
  51.         pas = *pa;
  52.         pa = &pas;
  53.     }
  54.         ta = &pa -> pa_addr.sa_addr;
  55.     ta -> ta_selectlen = str2sel (myservice, 1, ta -> ta_selector, TSSIZE);
  56.  
  57.     if (ctx == NULLOID && (ctx = oid_cpy (CHANNEL_AC)) == NULLOID) {
  58.         PP_LOG (LLOG_EXCEPTIONS, ("out of memory"));
  59.         return NOTOK;
  60.     }
  61.     if (pci == NULLOID) {
  62.         if ((pci = oid_cpy (CHANNEL_PCI)) == NULLOID) { 
  63.             PP_LOG (LLOG_EXCEPTIONS, ("out of memory"));
  64.             return NOTOK;
  65.         }
  66.     }
  67.     pcs.pc_nctx = 1;
  68.     pcs.pc_ctx[0].pc_id = 1;
  69.     pcs.pc_ctx[0].pc_asn = pci;
  70.     pcs.pc_ctx[0].pc_atn = NULLOID;
  71.  
  72.     if ((sf = addr2ref (PLocalHostName ())) == NULL) {
  73.         sf = &sfs;
  74.         (void) bzero ((char *) sf, sizeof *sf);
  75.     }
  76.     switch (result = AcAsynAssocRequest (ctx, NULLAEI, NULLAEI, NULLPA,
  77.                          pa, &pcs, NULLOID, 0,
  78.                          ROS_MYREQUIRE,
  79.                          SERIAL_NONE, 0, sf, NULLPEP, 0,
  80.                          NULLQOS, acc, aci, 1)) {
  81.         case NOTOK:
  82.         acs_advise (aca, "A-ASSOCIATE.REQUEST");
  83.         return NOTOK;
  84.         case CONNECTING_1:
  85.         case CONNECTING_2:
  86.         *fd = acc -> acc_sd;
  87.         ACCFREE (acc);
  88.         PP_TRACE (("Association initiated"));
  89.         return result;
  90.         case DONE:
  91.         if (acc -> acc_result != ACS_ACCEPT) {
  92.             PP_LOG (LLOG_EXCEPTIONS, 
  93.                 ("Association rejected: [%s]",
  94.                  AcErrString (acc -> acc_result)));
  95.             return NOTOK;
  96.         }
  97.         *fd = acc -> acc_sd;
  98.         ACCFREE (acc);
  99.         PP_TRACE (("Association established"));
  100.         if (RoSetService (*fd, RoPService, roi) == NOTOK) {
  101.             ros_advise (rop, "set RO/PS fails");
  102.             return NOTOK;
  103.         }
  104.         PP_TRACE (("Service set"));
  105.         return DONE;
  106.         default:
  107.         PP_LOG (LLOG_EXCEPTIONS,
  108.             ("Bad response from AcAsynAssocRequest"));
  109.         return NOTOK;
  110.     }
  111. }
  112.  
  113. int acsap_retry (fd)
  114. int    fd;
  115. {
  116.     struct AcSAPconnect accs;
  117.     register struct AcSAPconnect   *acc = &accs;
  118.     struct AcSAPindication  acis;
  119.     register struct AcSAPindication *aci = &acis;
  120.     register struct AcSAPabort *aca = &aci -> aci_abort;
  121.     struct RoSAPindication rois;
  122.     register struct RoSAPindication *roi = &rois;
  123.     register struct RoSAPpreject *rop = &roi -> roi_preject;
  124.     int    result;
  125.  
  126.     PP_TRACE (("acsap_retry(%d)", fd));
  127.     switch (result = AcAsynRetryRequest (fd, acc, aci)) {
  128.         case CONNECTING_1:
  129.         case CONNECTING_2:
  130.         ACCFREE (acc);
  131.         return result;
  132.         case NOTOK:
  133.         acs_advise (aca, "A-ASSOCIATE.REQUEST");
  134.         return NOTOK;
  135.         case DONE:
  136.         if (acc -> acc_result != ACS_ACCEPT) {
  137.             PP_LOG (LLOG_EXCEPTIONS,
  138.                 ("Association Rejected: [%s]",
  139.                  AcErrString (acc -> acc_result)));
  140.             return NOTOK;
  141.         }
  142.         ACCFREE (acc);
  143.         if (RoSetService (fd, RoPService, roi) == NOTOK) {
  144.             ros_advise (rop, "set RO/PS fails");
  145.             return NOTOK;
  146.         }
  147.         return DONE;
  148.         default:
  149.         adios (NULLCP, "Bad response from AcAsynRetryRequest");
  150.         return NOTOK;
  151.     }
  152. }
  153.  
  154. int  assoc_release (sd)
  155. int     sd;
  156. {
  157.     struct AcSAPrelease acrs;
  158.     register struct AcSAPrelease   *acr = &acrs;
  159.     struct AcSAPindication  acis;
  160.     register struct AcSAPindication *aci = &acis;
  161.     register struct AcSAPabort *aca = &aci -> aci_abort;
  162.  
  163.     if (AcRelRequest (sd, ACF_NORMAL, NULLPEP, 0, NOTOK, acr, aci) == NOTOK) {
  164.         acs_advise (aca, "A-RELEASE.REQUEST");
  165.         return DONE;
  166.     }
  167.  
  168.     if (!acr -> acr_affirmative) {
  169.         (void) AcUAbortRequest (sd, NULLPEP, 0, aci);
  170.         PP_NOTICE (("Release rejected by peer: %d",
  171.                 acr -> acr_reason));
  172.     }
  173.  
  174.     ACRFREE (acr);
  175.     PP_TRACE (("Association released"));
  176.  
  177.     return DONE;
  178. }
  179.